//  Arduino pro micro, Arduino leonardo (Atmega 32u4)
//  HUB, ,   Amp,  ,  BACK/HOME

#include <avr/sleep.h>
#include <avr/power.h>

int ACCPin = 2; //  
int sleepStatus = 0; //     (, ) -    
int analogPin=A1; //      (  6(4))

#define pinAmp 6 //     Amp
#define pinHUB 5 //    HUB
#define pinTablet 9 //    

//****************   /*************************
#define ONHUB 100 //   HUB
#define ONTablet 4000 //   
#define ONAmp 8000 //    AMP  
#define OFFHUB 24000 //   HUB
#define OFFTablet 16000 //   
#define OFFAmp 8000 //    AMP  
//**************        ***************
int release_button = 1023; //    
int button_release_range = 50; //   + -   
int button_range = 15; //    + -
int time_holding = 500; //      
int time_tinkling = 10; //      
int vol_up = 897; //    
int vol_down = 838; //    
int alt_tab = 471; //       Alt + Tab
int next = 583; //       Next     Fast Forward  
int previous = 685; //       Previous     Rewind  
int play_pause = 171; //       Play/Pause     Mute  
//*******************************************************************************************
unsigned long duration, millisold, off = 0;
boolean stateACC, relestate1, relestate2, relestate3 = 0;

int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long eventTime1 = 0;
unsigned long pauseMillis = 0;


void wakeUpNow()                 //    
{
  if (sleepStatus)               //   ,
  {
    sleep_disable();             //  ,      -   
    sleepStatus = 0;             //     
    detachInterrupt(1);          //   -    wakeUpNow()   
  }
   
  // ,        loop()
  //   ,   (serial.print  ...)    
  //      - .  ,
  // ..    
}


void setup()
{
  pinMode(ACCPin, INPUT);
  attachInterrupt(1, wakeUpNow, FALLING);    //   1 (pin 2)    wakeUpNow
  pinMode(pinHUB, OUTPUT); 
  pinMode(pinTablet, OUTPUT);
  pinMode(pinAmp, OUTPUT);
  Keyboard.begin();
  Serial.begin(115200);

}

void sleepNow()                          //     .
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //    
  sleep_enable();                        //  sleep-   mcucr.    
      
  attachInterrupt(1, wakeUpNow, FALLING);   //   1 (pin 2)    wakeUpNow       2
  
  sleepStatus = 1;                       //     
  sleep_mode();                          //      !!!
  //-------------------------     !!!--------------------------//
  Serial.begin(115200);

}


void loop()
{
  Power();
  Knopki();
  delay(10);
}

void Power()
 {
  if (!digitalRead(ACCPin)&&stateACC) 
    {
    stateACC=0;
    duration = millis();
    }
  if (digitalRead(ACCPin)&&!stateACC) 
    {
    stateACC=1;
    off = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC && millis ()-duration > ONHUB)
    {
    digitalWrite(pinHUB, HIGH);
    relestate1 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONAmp)
    {
    digitalWrite(pinAmp, HIGH);
    relestate2 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONTablet)
    {
    digitalWrite(pinTablet, HIGH);
    relestate3 = 1;
    millisold = millis();
    }
  if(digitalRead(ACCPin) && stateACC && millis () -off> OFFHUB)
    {
    digitalWrite(pinHUB, LOW);
    relestate1 = 0;
    millisold = millis();
    Serial.end();
    delay(100);
    sleepNow(); 
    }
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFAmp)
    {
    digitalWrite(pinAmp, LOW);
    relestate2 = 0;
    millisold = millis();     
    } 
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFTablet)
    {
    digitalWrite(pinTablet, LOW);
    relestate3 = 0;
    millisold = millis();     
    }  
}


void Knopki()
{ 
data=analogRead(analogPin); //    

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0) //    
{ 
eventTime=millis(); 
} 

//**********************  ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
Remote.increase(); 
flag = 5; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.increase(); //    ,    0,1  
flag = 3; 
Remote.clear(); 
delay(100); 
} 

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_down - button_range && data <= vol_down + button_range && flag == 0) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
Remote.decrease(); 
flag = 6; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.decrease(); //    ,    0,1  
flag = 3; 
Remote.clear(); 
delay(100); 
} 

//********************** AltTab +    ************************************  

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - button_range && data <= alt_tab + button_range) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
flag = 1; 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis == 0) //     , Alt+Tab 
{ 
Keyboard.press(KEY_LEFT_ALT); 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
flag = 0; 
pauseMillis = millis(); 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis != 0) //      , Alt+Tab 
{ 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
flag = 0; 
pauseMillis = millis(); 
} 

if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - button_release_range && data<=release_button + button_release_range) // && flag == 7 && data>=950) 
{ 
flag = 0; 
pauseMillis = 0; 
Keyboard.releaseAll(); 
} 

if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1) //    500  ?  (  millis()-eventTime>time_holding) 
{  
//Remote.play_pause(); //    ,    
flag = 0; 
//delay(10); 
//Remote.clear(); 
} 
//********************** Next  Fast Forward ************************************  

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next - button_range && data <= next + button_range) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
flag = 2; 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2) //     , Next 
{ 
Remote.next(); 
flag = 0; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + button_range && flag == 2 || data >= next - button_range && data <= next + button_range && flag == 3) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.forward(); //    , Fast Forward 
flag = 3; 
Remote.clear(); 
delay(100); 
} 
//********************** Previous  Rewind ************************************  

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous - button_range && data <= previous + button_range) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
flag = 4; 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4) //     , Previous 
{ 
Remote.previous(); 
flag = 0; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= previous - button_range && data <= previous + button_range && flag == 4 || data >= previous - button_range && data <= previous + button_range && flag == 3) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.rewind(); //    , Rewind 
flag = 3; 
Remote.clear(); 
delay(100); 
} 

//********************** Play/pause + Mute ************************************  

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
flag = 7; 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 7) //     ,  /  
{ 
Remote.play_pause();  
flag = 0; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 7) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.mute(); //    ,  
flag = 0;
delay(10);
Remote.clear(); 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6) //     
{ 
flag = 0; 
}  
}  